]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
weather: Skip loading indication when updating frequently
authorFlorian Müllner <fmuellner@gnome.org>
Sat, 25 Feb 2017 00:36:47 +0000 (01:36 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Wed, 1 Mar 2017 09:52:43 +0000 (10:52 +0100)
Weather conditions - at least as far as online services are
concerned - don't usually change in a couple of minutes.
So when updating shortly after a previous update, assume
the current conditions are still valid and trigger an
update without showing a loading indication. This should
help a bit with not getting stuck permanently in loading
state when on a shitty network.

https://bugzilla.gnome.org/show_bug.cgi?id=754031

js/misc/weather.js

index f645222e4a14ee6eefbbc9e6f7e83952180caf37..2ea90d312ef85b9788ddfc64448575d48d0f78cc 100644 (file)
@@ -2,17 +2,22 @@
 
 const Geoclue = imports.gi.Geoclue;
 const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
 const GWeather = imports.gi.GWeather;
 const Lang = imports.lang;
 const Signals = imports.signals;
 
 const Util = imports.misc.util;
 
+// Minimum time between updates to show loading indication
+const UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE;
+
 const WeatherClient = new Lang.Class({
     Name: 'WeatherClient',
 
     _init: function() {
         this._loading = false;
+        this._lastUpdate = GLib.DateTime.new_from_unix_local(0);
 
         this._useAutoLocation = false;
         this._mostRecentLocation = null;
@@ -29,6 +34,7 @@ const WeatherClient = new Lang.Class({
                         GWeather.Provider.OWM;
         this._weatherInfo = new GWeather.Info({ enabled_providers: providers });
         this._weatherInfo.connect_after('updated', () => {
+            this._lastUpdate = GLib.DateTime.new_now_local();
             this.emit('changed');
         });
 
@@ -58,7 +64,13 @@ const WeatherClient = new Lang.Class({
     },
 
     update: function() {
-        this._loadInfo();
+        let now = GLib.DateTime.new_now_local();
+        // Update without loading indication if the current info is recent enough
+        if (this._weatherInfo.is_valid() &&
+            now.difference(this._lastUpdate) < UPDATE_THRESHOLD)
+            this._weatherInfo.update();
+        else
+            this._loadInfo();
     },
 
     _loadInfo: function() {